package com.ophiux.utils.image;

import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
 * @desc: 图片压缩工具类
 * @author: hhl
 * @date：2022/4/13 18:02
 */
@Slf4j
public class ImageUtil {

	/**
	 * 根据指定大小压缩图片
	 *
	 * @param imageBytes 源图片字节数组
	 * @param filename   文件名字
	 * @return
	 */
	public static byte[] compressPicForScale(byte[] imageBytes, String filename) {
		return compressPicForScale(imageBytes, filename, 300L);
	}

	/**
	 * 根据指定大小压缩图片
	 *
	 * @param imageBytes  源图片字节数组
	 * @param filename    文件名字
	 * @param desFileSize 指定图片大小，单位kb
	 * @return
	 */
	public static byte[] compressPicForScale(byte[] imageBytes, String filename, long desFileSize) {
		return compressPicForScale(imageBytes, filename, desFileSize, 1.0);
	}

	/**
	 * 根据指定大小压缩图片
	 *
	 * @param imageBytes  源图片字节数组
	 * @param filename    文件名字
	 * @param desFileSize 指定图片大小，单位kb
	 * @param quality     是输出图片的质量 0-1，即：清晰度/分辨率。
	 * @return
	 */
	public static byte[] compressPicForScale(byte[] imageBytes, String filename, long desFileSize, Double quality) {
		return compressPicForScale(imageBytes, filename, desFileSize, 1f, quality);
	}


	/**
	 * 根据指定大小压缩图片
	 *
	 * @param imageBytes  源图片字节数组
	 * @param filename    文件名字
	 * @param desFileSize 指定图片大小，单位kb
	 * @param scale       图片缩小比例 0-1
	 * @param quality     是输出图片的质量 0-1，即：清晰度/分辨率。
	 * @return
	 */
	public static byte[] compressPicForScale(byte[] imageBytes, String filename, long desFileSize, double scale, Double quality) {
		if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {
			return imageBytes;
		}
		long srcSize = imageBytes.length;
		try {
			ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
			Thumbnails.of(inputStream).scale(scale).outputQuality(quality).toOutputStream(outputStream);
			imageBytes = outputStream.toByteArray();
			log.info("【图片压缩】imageId={} | 图片原大小={}kb | 压缩后大小={}kb", filename, srcSize / 1024, imageBytes.length / 1024);
		} catch (Exception e) {
			log.error("【图片压缩】msg=图片压缩失败!", e);
		}
		return imageBytes;
	}
	
	public static void main(String[] args) {
//		compressPicForScale(data, "adfsdf",100L,1f,0.5);
	}
}
